知乎专栏 |
Springboot 1.x
@Bean public CacheManager cacheManager(RedisTemplate redisTemplate) { RedisCacheManager cacheManager = new RedisCacheManager(redisTemplate); cacheManager.setDefaultExpiration(60); //缓存默认 60 秒 Map<String, Long> expiresMap = new HashMap<>(); expiresMap.put("Product", 5L); //设置 key = Product 时 5秒缓存。你可以添加很多规则。 cacheManager.setExpires(expiresMap); return cacheManager; }
Springboot 2.x
package api.config; import java.time.Duration; import java.util.HashMap; import java.util.Map; import org.springframework.cache.CacheManager; import org.springframework.cache.interceptor.KeyGenerator; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.cache.RedisCacheConfiguration; import org.springframework.data.redis.cache.RedisCacheManager; import org.springframework.data.redis.cache.RedisCacheWriter; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.RedisSerializationContext; import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.databind.ObjectMapper; @Configuration public class CachingConfigurer { public CachingConfigurer() { // TODO Auto-generated constructor stub } @Bean public KeyGenerator simpleKeyGenerator() { return (o, method, objects) -> { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append(o.getClass().getSimpleName()); stringBuilder.append("."); stringBuilder.append(method.getName()); stringBuilder.append("["); for (Object obj : objects) { stringBuilder.append(obj.toString()); } stringBuilder.append("]"); return stringBuilder.toString(); }; } @Bean public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) { return new RedisCacheManager(RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory), this.redisCacheConfiguration(600), // 默认配置 this.initialCacheConfigurations()); // 指定key过期时间配置 } private Map<String, RedisCacheConfiguration> initialCacheConfigurations() { Map<String, RedisCacheConfiguration> redisCacheConfigurationMap = new HashMap<>(); redisCacheConfigurationMap.put("UserInfoList", this.redisCacheConfiguration(3000)); redisCacheConfigurationMap.put("UserInfoListAnother", this.redisCacheConfiguration(18000)); return redisCacheConfigurationMap; } private RedisCacheConfiguration redisCacheConfiguration(Integer seconds) { Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class); ObjectMapper om = new ObjectMapper(); om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); jackson2JsonRedisSerializer.setObjectMapper(om); RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig(); redisCacheConfiguration = redisCacheConfiguration.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer)).entryTtl(Duration.ofSeconds(seconds)); return redisCacheConfiguration; } }
@Cacheable(value = "DefaultKey", keyGenerator = "simpleKeyGenerator") // 600秒,使用默认策略 @Cacheable(value = "UserInfoList", keyGenerator = "simpleKeyGenerator") // 3000秒 @Cacheable(value = "UserInfoListAnother", keyGenerator = "simpleKeyGenerator") // 18000秒
127.0.0.1:6379> keys * 1) "test2::SimpleKey []" 127.0.0.1:6379> ttl "test2::SimpleKey []" (integer) 584